package br.com.ffm.praticas.teste;

import static org.junit.Assert.*;

import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import br.com.ffm.praticas.modelo.*;

public class UsuarioTest {
	
	private Usuario usuarioTeste;
	private Usuario usuarioTeste2;
	private Mensagem msg;
	private Mensagem resposta;
	private Email sistema;
	private Pasta pasta;
	private List<Mensagem> listaMsg;
	
	@Before
	public void setUp() throws Exception {
		
		sistema = new Email();
		
		usuarioTeste = new Usuario("emailteste@teste.com", "teste", "teste", "teste");
		sistema.addUsuario(usuarioTeste);
		
		usuarioTeste2 = new Usuario("emailteste2@teste.com", "teste", "teste", "teste");
		usuarioTeste2.addPasta(new Pasta("IMPORTANTES"));
		FiltroMsg filtro1 = new FiltroMsg("teste", new PorAssunto(), 
				usuarioTeste2.buscaPasta("IMPORTANTES"));
		usuarioTeste2.addFiltro(filtro1);
		sistema.addUsuario(usuarioTeste2);
		
		msg = new Mensagem(usuarioTeste.getEnderecoEmail(), 
				usuarioTeste2.getEnderecoEmail(), "assunto teste", "mesagem teste");
		
		resposta = new Mensagem(usuarioTeste2.getEnderecoEmail(), 
				msg.getEmailRemetente(), msg.getAssunto(), "resposta teste");
	}

	@Test
	public void testVerificaSenha() {
		Assert.assertTrue(usuarioTeste.verificaSenha("teste"));
		Assert.assertFalse(usuarioTeste.verificaSenha("teste1"));
	}

	@Test
	public void testEnviarMensagem() throws UsuarioInexistenteException {
		usuarioTeste.enviarMensagem(sistema, msg);
		this.pasta = usuarioTeste.buscaPasta("CAIXA DE ENTRADA");
		Assert.assertFalse(pasta.getMensagens().contains(msg));
		this.pasta = usuarioTeste.buscaPasta("ENVIADOS");
		Assert.assertTrue(pasta.getMensagens().contains(msg));
		this.pasta = usuarioTeste2.buscaPasta("IMPORTANTES");
		Assert.assertTrue(pasta.getMensagens().contains(msg));		
	}

	@Test
	public void testArmazenaMensagem() throws UsuarioInexistenteException {
		usuarioTeste2.armazenaMensagem(msg);
		this.pasta = usuarioTeste2.buscaPasta("CAIXA DE ENTRADA");
		Assert.assertFalse(pasta.getMensagens().contains(msg));
		this.pasta = usuarioTeste2.buscaPasta("IMPORTANTES");
		Assert.assertTrue(pasta.getMensagens().contains(msg));
	}
	
	@Test
	public void testResponderMsg() {
		usuarioTeste2.responderMsg(msg, resposta);
		Assert.assertNotNull(msg.getSubmensagens());
		Assert.assertEquals(resposta, msg.getSubmensagens().get(0));
	}

	@Test
	public void testBuscaPasta() {
		Assert.assertNotNull(usuarioTeste2.buscaPasta("IMPORTANTES"));
		Assert.assertEquals(usuarioTeste2.buscaPasta("IMPORTANTES").getTitulo(), "IMPORTANTES");
	}

	@Test
	public void testPesquisaMsgRemetente() {
		usuarioTeste.getAllMsg().add(msg);
		this.listaMsg = usuarioTeste.pesquisaMsgRemetente("emailteste@teste.com");
		Assert.assertNotNull(listaMsg);
		Assert.assertEquals(1, listaMsg.size());
		Assert.assertEquals(listaMsg.get(0), msg);
	}

	@Test
	public void testPesquisaMsgDestinatario() {
		usuarioTeste.getAllMsg().add(msg);
		this.listaMsg = usuarioTeste.pesquisaMsgDestinatario("emailteste2@teste.com");
		Assert.assertNotNull(listaMsg);
		Assert.assertEquals(1, listaMsg.size());
		Assert.assertEquals(listaMsg.get(0), msg);
		this.listaMsg = usuarioTeste.pesquisaMsgDestinatario("email@teste.com");
		Assert.assertEquals(0, listaMsg.size());
	}

	@Test
	public void testPesquisaMsg() {
		usuarioTeste.getAllMsg().add(msg);
		this.listaMsg = usuarioTeste.pesquisaMsg("teste");
		Assert.assertNotNull(listaMsg);
		Assert.assertEquals(1, listaMsg.size());
		Assert.assertEquals(listaMsg.get(0), msg);
	}

}